#ifndef NE_STL_SET_H
#define NE_STL_SET_H
#include "ne_stl_build.h"
#include "phmap.h"
namespace nstd {
template <class T>
using hash_default_hash = phmap::priv::hash_default_hash<T>;
template <class T>
using hash_default_eq = phmap::priv::hash_default_eq<T>;
template <class T>
using Allocator = phmap::priv::Allocator<T>;
template <class T, class Hash = hash_default_hash<T>, class Eq = hash_default_eq<T>, class Alloc = Allocator<T>>
class set : public phmap::flat_hash_set<T, Hash, Eq, Alloc> {  // NOLINT
public:
    set() {
        static_assert(std::is_standard_layout<T>::value, "T should be standard layout");
        static_assert(std::is_standard_layout<set>::value, "set should be standard layout");
    }
};
using NullMutex = phmap::NullMutex;
template <class T,
    class Hash = hash_default_hash<T>,
    class Eq = hash_default_eq<T>,
    class Alloc = Allocator<T>,
    size_t N = 4,  // NOLINT
    class Mtx = NullMutex>
class parallel_set : public phmap::parallel_flat_hash_set<T, Hash, Eq, Alloc> {  // NOLINT
public:
    parallel_set() {
        static_assert(std::is_standard_layout<T>::value, "T should be standard layout");
        static_assert(std::is_standard_layout<parallel_set>::value, "parallel_set should be standard layout");
    }
};
}  // namespace nstd
#endif